DjangoでRESTful Webサービスの実装
Django REST Framework について
Django は Webアプリケーションのためのフルスタックフレームワークで、広く利用されています。Django REST Framework (以下DRFと略します)という Django のためのパッケージを使うことで、RESTful Webサービスを簡単に構築することができるようになります。 DRFの特徴
DRFには次の特徴があります。
Webブラウザでアクセス可能
RESTful Webサービスの開発でブラウザから動作確認できることは、開発者にはとても使い勝手がよく大きなメリットです。
認証ポリシーのサポート
OAuth1およびOAuth2のパッケージを含む認証ポリシーをサポートしています。
シリアライズ/ディシリアライズ
ORMおよび非ORMデータソースの両方をサポートをシリアライズ/ディシリアライズすることができます。。
カスタマイズ可能なビュー
強力な機能が必要ない場合は、通常の関数ベースのビューを使用することができます。
豊富なドキュメントと優れたコミュニティサポート
豊富な運用例
多くの国際的に認められた企業によって信頼され、使用されています。
インストール
既にCONDA環境になっているのであれば抜けておきましょう。
code: bash
$ conda deactivate
conda環境を作ります。このとき python と curl をインストールしておきます。
code: bash
$ conda create -y -n django_drf python=3.6 curl
$ conda activate django_drf
Django と関連パッケージをインストールしておきましょう。
code: bash
$ pip install django djangorestframework django-filters django-extensions
DRFの準備
プロジェクトのディレクトリを作成します。
code: bash
$ mkdir -p $HOME/DRF
$ cd $HOME/DREF/
$ django-startproject todo
$ cd todo
todo/settings.py の INSTALLED_APPSに rest_framework を追加します。
code: python
INSTALLED_APPS = [
# ...
'rest_framework'
]
WebアプリケーションTODOを実装
アプリケーション TODO のセットアップを行います。
code: bash
$ python manage.py startapp apiv1
公開されたAPIとしてタスクを登録削除するRESTful Webサービスを作成するためには、
次の作業をするだけです。
1. タスクのモデルを作成する
2. タスクのシリアライザを作成する
3. タスクのモデルビューセットを作成する
4. URLパターンを登録
モデルの作成
DRFのModelViewSet を使うと 「モデルを作る 」ことが「CURD操作のAPIを作る」こととほぼ同じことになります。
まず、apiv1/models.py を作成します。
code: python
from django.db import models
class Task(Base):
id = models.IntegerField(primary_key=True)
title = models.CharField(max_length=32, null=False)
description = models.CharField(max_length=128, null=True)
done = models.BooleanField(default=False)
class Meta:
db_table = 'tasks'
シリアライザの作成
apiv1/serializers.py はこのタスクモデルを指示します。
code: python
from rest_framework import serializers
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = '__all__'
URLパターンを登録
todo/urls.py に apiv1 の URLパターンを追加します。
code: python
urlpatterns = [
# ...
path('^todo/v1.0/', include('apiv1.urls'))
]
apiv1/urls.py は次のように定義します。
code: python
from django.urls import include, path
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register(r'tasks', views.TaskViewSet)
urlpatterns = [
path('', include(router.urls)),
path('auth/', include('rest_framework.urls', namespace='rest_framework')),
]
モデルビューセットを作成
タスクのモデルビューセットを作成します。
apiv1/views.py
code: python
from rest_framework import viewsets, routers
from apiv1.models import Task
from apiv1.serializers import TaskSerializer
class TaskViewSet(viewsets.ModelViewSet):
queryset = Task.objects.all()
serializer_class = TaskSerializer
データベースへ反映
code: bash
$ python manage.py makemigrations
$ python manage.py migrate
動作確認
はじめはタスクがひとつもないので、タスクをシェルから登録しておきましょう。
code: bash
$ python manage.py shell
>> from apiv1.models import Task
>> task = Task(title='Go Symnastics', description='Go to Anytime Fitness')
>> task.save()
>>
Djnago を起動して確認してみます。
code: bash
$ python manage.py runserver 8080
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
June 01, 2020 - 05:48:10
Django version 3.0.6, using settings 'todo.settings'
Quit the server with CONTROL-C.
ブラウザでアクセスしてみると API Root が表示されます。
http://127.0.0.1:8080/todo/api/v1.0
https://gyazo.com/797753651bfc50d9e4535df9c22b2046
次に 表示されているURLにアクセスしてみると タスクの一覧が表示されます。
(いま時点は、タスクが1つしか登録されていません)
https://gyazo.com/2450ad262aed2613de32d921fbea4710
同じページの下部にあるデータ領域に入力してPOSTしてみましょう。
https://gyazo.com/6c2940ad4202903261ec352a2bc1a29d
ここで、参照するタスクのIDをURIで指定するとPUTメソッドで変更、DELETEメソッドで削除ができるようになります。
今回はDRFがブラウザからアクセスできることを強調するため、ブラウザでタスクのCRUD操作をしましたが、もちろんcrul を使っても問題ありません。
DRF のまとめ
ここまでで定義したのは、モデルクラスと Serializer とModelViewSet です。
これだけで、リソースのCRUD操作のAPIが作成できてしまいます。
table: DRFのAPIとHTTPメソッドとの対応
HTTPメソッド CRUD操作 URL例
GET READ(一覧) /todo/api/v1.0/tasks
GET READ(詳細) /todo/api/v1.0/tasks/{task_id}
POST CREATE /todo/api/v1.0/tasks
PUT UPDATE(全フィールド) /todo/api/v1.0/taks/{task_id}
PATCH UPDATE(一部フィールド) /todo/api/v1.0/taks/{task_id}
DELETE DELETE(削除) /todo/api/v1.0/taks/{task_id}
参考: